//package com.competition.web.admin.log.impl;
//
//import java.lang.reflect.Array;
//import java.lang.reflect.Field;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.annotation.After;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//
//import com.competition.web.admin.service.ILogContentService;
//import com.competition.web.admin.service.ILogService;
//import com.competition.web.admin.service.ITableColumnInfoService;
//import com.basic.service.contract.IBaseService;
//import com.competition.web.admin.util.SpringBeanUtil;
//import com.competition.web.entity.Log;
//import com.competition.web.entity.LogContentWithBLOBs;
//import com.competition.web.util.StringUtil;
//
//
///**
// * 记录更新记录
// * 
// * @author 111
// *
// */
//@Aspect
//@Component
//public class UpdateStatusDataSourceAspect extends AbstractLog{
//
//	private static final Logger logger = LoggerFactory.getLogger(UpdateStatusDataSourceAspect.class);
//
//	private final String[] SELECT_PREFIX = { "select", "get", "count", "guess"};
//	
//	private IgnoreUpdateStatusByConfig ignoreUpdateStatusByConfig;
//	
//	public UpdateStatusDataSourceAspect(IgnoreUpdateStatusByConfig ignoreUpdateStatusByConfig) {
//		this.ignoreUpdateStatusByConfig = ignoreUpdateStatusByConfig;
//	}
//	
//	/**
//	 * Dao aspect.
//	 */
//	@Pointcut("execution(* com.competition.web.admin.mapper.CarouselFigureMapper.updateStatusBatchByData(..))")
//	public void daoAspect() {
//		logger.debug("daoAspect", "我来了");
//	}
//
//	/**
//	 * Switch DataSource
//	 *
//	 * @param point the point
//	 */
//	@Before("daoAspect()")
//	public void switchDataSource(JoinPoint point) {
//		
//		org.aspectj.lang.Signature signature = point.getSignature();
//		
//		String name = signature.getName();
//		
//		Boolean isSelect = isQueryMethod(name);
//		
//		if (isSelect) {
//			return;
//		} 
//		
//		Class<?> type =  signature.getDeclaringType();
//
//		
//		String className = type.getName();
//		
//		className = className.substring(className.lastIndexOf('.') + 1).replace("Mapper", "");
//		
//		String tableName = "mg".concat(StringUtil.decamelize(className));
//		
//		String serviceName = StringUtil.toLowerByFirstChar(className).concat("ServiceImpl");
//		
//		IBaseService<Object> baseService = SpringBeanUtil.getBean(serviceName);
//
//		Map<String, String> tableColumn = SpringBeanUtil.getBean(ITableColumnInfoService.class)
//				.getTableComment(tableName);
//		
//		Object[] objects =  point.getArgs();
//
//		int size = 0;
//		
//		for (int i = 0; i < objects.length; i++) {
//			
//			if (objects[i].getClass().isArray()) {
//				
//				Object obj = objects[i];
//				
//				size = Array.getLength(obj);
//				
//				for (int j = 0; j < size; j++) {
//					
//					this.parse(baseService, Array.get(obj, j), tableName,tableColumn);
//				}
//				
//			} else {
//				this.parse(baseService, objects[i], tableName, tableColumn);
//
//			}
//			
//		}
//	}
//
//	private int parse(IBaseService<Object> baseService, Object param, String tableName, Map<String, String> tableColumn) {
//
//		List<LogContentWithBLOBs> logContents = new ArrayList<>();
//
//		LogContentWithBLOBs content;
//
//		Class<?> target = param.getClass();
//
//		String name;
//
//		Object value;
//
//		try {
//			
//			Object idValue;
//
//			Field idField = target.getDeclaredField("id");
//
//			idValue = this.getPropertyValue(idField.getName(), target, param);
//			
//			String idString = idValue.toString();
//			
//			Object object = baseService.selectByPrimaryKey(Integer.valueOf(idString));
//
//			Map<String, Object> mapOrigialData = getDataToMap(object);
//
//			Map<String, Object> newData = getDataToMap(param);
//
//			cleanNoNeedData(mapOrigialData);
//
//			newData = cleanNull(newData);
//			
//			cleanNoNeedData(newData);
//
//			ILogService logService = SpringBeanUtil.getBean(ILogService.class);
//
//			Log log = new Log();
//
//			log.setTableId(Long.valueOf(idString));
//			
//			int status = logService.insertParse(log, tableName, (byte) 1);
//
//			if (0 == status) { // 添加日志失败
//				return 1;
//			}
//
//			Object origialData;
//
//			
//
//			long time = System.currentTimeMillis() / 1000;
//
//			for (Map.Entry<String, Object> item : newData.entrySet()) {
//				name = item.getKey();
//
//				if (name.equals("id")) {
//					continue;
//				}
//
//				value = this.getPropertyValue(name, target, param);
//
//				if (null == value) {
//					continue;
//				}
//
//				content = new LogContentWithBLOBs();
//
//				content.setKey(name);
//
//				content.setCreateTime(time);
//
////				System.out.println("name: " + name);
//
//				origialData = mapOrigialData.get(name);
//
//				if (null == origialData) {
//					origialData = "";
//				}
//
//				content.setValue(origialData.toString());
//
//				content.setComment(tableColumn.get(name));
//
//				content.setCurrentValue(value.toString());
//
//				content.setLogId(log.getId());
//
//				content.setId(0L);
//
//				logContents.add(content);
//			}
//
//			ILogContentService logContentService = SpringBeanUtil.getBean(ILogContentService.class);
//
//			logContentService.batchInsert(logContents.stream().toArray(LogContentWithBLOBs[]::new));
//
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//
//		return 1;
//	}
//	
//	/**
//	 * Restore DataSource
//	 *
//	 * @param point the point
//	 */
//	@After("daoAspect()")
//	public void restoreDataSource(JoinPoint point) {
//		
//	}
//
//	/**
//	 * Judge if method start with query prefix
//	 *
//	 * @param methodName
//	 * @return
//	 */
//	private Boolean isQueryMethod(String methodName) {
//		
//		// 忽略配置中的方法
//		String[] ingoreMethods = this.ignoreUpdateStatusByConfig.getMethods();
//		
//		if (null == ingoreMethods) {
//			return false;
//		}
//		
//		for (int i = 0; i < ingoreMethods.length; i++) {
//			
//			if (ingoreMethods[i].equals(methodName)) {
//				return false;
//			}
//		}
//		
//		
//		for (String prefix : SELECT_PREFIX) {
//			if (methodName.startsWith(prefix)) {
//				return true;
//			}
//		}
//		return false;
//	}
//}